{
  "cells": [
    {
      "cell_type": "markdown",
      "source": [
        "# PyTorch Regression"
      ],
      "metadata": {
        "nteract": {
          "transient": {
            "deleting": false
          }
        }
      }
    },
    {
      "cell_type": "code",
      "source": [
        "import numpy as np\n",
        "import matplotlib.pyplot as plt\n",
        "import pandas as pd\n",
        "\n",
        "import warnings\n",
        "warnings.filterwarnings(\"ignore\")\n",
        "\n",
        "import yfinance as yf\n",
        "yf.pdr_override()"
      ],
      "outputs": [],
      "execution_count": 1,
      "metadata": {
        "collapsed": true,
        "jupyter": {
          "source_hidden": false,
          "outputs_hidden": false
        },
        "nteract": {
          "transient": {
            "deleting": false
          }
        },
        "execution": {
          "iopub.status.busy": "2022-06-02T01:53:31.545Z",
          "iopub.execute_input": "2022-06-02T01:53:31.551Z",
          "shell.execute_reply": "2022-06-02T01:53:31.516Z",
          "iopub.status.idle": "2022-06-02T01:53:31.558Z"
        }
      }
    },
    {
      "cell_type": "code",
      "source": [
        "# input\n",
        "symbol = 'AMD'\n",
        "start = '2014-01-01'\n",
        "end = '2018-08-27'\n",
        "\n",
        "# Read data \n",
        "dataset = yf.download(symbol,start,end)\n",
        "\n",
        "# View Columns\n",
        "dataset.head()"
      ],
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "[*********************100%***********************]  1 of 1 completed\n"
          ]
        },
        {
          "output_type": "execute_result",
          "execution_count": 2,
          "data": {
            "text/plain": "            Open  High   Low  Close  Adj Close    Volume\nDate                                                    \n2014-01-02  3.85  3.98  3.84   3.95       3.95  20548400\n2014-01-03  3.98  4.00  3.88   4.00       4.00  22887200\n2014-01-06  4.01  4.18  3.99   4.13       4.13  42398300\n2014-01-07  4.19  4.25  4.11   4.18       4.18  42932100\n2014-01-08  4.23  4.26  4.14   4.18       4.18  30678700",
            "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>Open</th>\n      <th>High</th>\n      <th>Low</th>\n      <th>Close</th>\n      <th>Adj Close</th>\n      <th>Volume</th>\n    </tr>\n    <tr>\n      <th>Date</th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>2014-01-02</th>\n      <td>3.85</td>\n      <td>3.98</td>\n      <td>3.84</td>\n      <td>3.95</td>\n      <td>3.95</td>\n      <td>20548400</td>\n    </tr>\n    <tr>\n      <th>2014-01-03</th>\n      <td>3.98</td>\n      <td>4.00</td>\n      <td>3.88</td>\n      <td>4.00</td>\n      <td>4.00</td>\n      <td>22887200</td>\n    </tr>\n    <tr>\n      <th>2014-01-06</th>\n      <td>4.01</td>\n      <td>4.18</td>\n      <td>3.99</td>\n      <td>4.13</td>\n      <td>4.13</td>\n      <td>42398300</td>\n    </tr>\n    <tr>\n      <th>2014-01-07</th>\n      <td>4.19</td>\n      <td>4.25</td>\n      <td>4.11</td>\n      <td>4.18</td>\n      <td>4.18</td>\n      <td>42932100</td>\n    </tr>\n    <tr>\n      <th>2014-01-08</th>\n      <td>4.23</td>\n      <td>4.26</td>\n      <td>4.14</td>\n      <td>4.18</td>\n      <td>4.18</td>\n      <td>30678700</td>\n    </tr>\n  </tbody>\n</table>\n</div>"
          },
          "metadata": {}
        }
      ],
      "execution_count": 2,
      "metadata": {
        "collapsed": true,
        "jupyter": {
          "source_hidden": false,
          "outputs_hidden": false
        },
        "nteract": {
          "transient": {
            "deleting": false
          }
        },
        "execution": {
          "iopub.status.busy": "2022-06-02T01:53:31.565Z",
          "iopub.execute_input": "2022-06-02T01:53:31.569Z",
          "shell.execute_reply": "2022-06-02T01:53:32.260Z",
          "iopub.status.idle": "2022-06-02T01:53:32.154Z"
        }
      }
    },
    {
      "cell_type": "code",
      "source": [
        "dataset['Increase_Decrease'] = np.where(dataset['Volume'].shift(-1) > dataset['Volume'],1,0)\n",
        "dataset['Buy_Sell_on_Open'] = np.where(dataset['Open'].shift(-1) > dataset['Open'],1,0)\n",
        "dataset['Buy_Sell'] = np.where(dataset['Adj Close'].shift(-1) > dataset['Adj Close'],1,0)\n",
        "dataset['Returns'] = dataset['Adj Close'].pct_change()\n",
        "dataset = dataset.dropna()"
      ],
      "outputs": [],
      "execution_count": 3,
      "metadata": {
        "collapsed": true,
        "jupyter": {
          "source_hidden": false,
          "outputs_hidden": false
        },
        "nteract": {
          "transient": {
            "deleting": false
          }
        },
        "execution": {
          "shell.execute_reply": "2022-06-02T01:53:32.263Z",
          "iopub.status.busy": "2022-06-02T01:53:32.163Z",
          "iopub.execute_input": "2022-06-02T01:53:32.167Z",
          "iopub.status.idle": "2022-06-02T01:53:32.175Z"
        }
      }
    },
    {
      "cell_type": "code",
      "source": [
        "dataset.head()"
      ],
      "outputs": [
        {
          "output_type": "execute_result",
          "execution_count": 4,
          "data": {
            "text/plain": "            Open  High   Low  Close  Adj Close    Volume  Increase_Decrease  \\\nDate                                                                          \n2014-01-03  3.98  4.00  3.88   4.00       4.00  22887200                  1   \n2014-01-06  4.01  4.18  3.99   4.13       4.13  42398300                  1   \n2014-01-07  4.19  4.25  4.11   4.18       4.18  42932100                  0   \n2014-01-08  4.23  4.26  4.14   4.18       4.18  30678700                  0   \n2014-01-09  4.20  4.23  4.05   4.09       4.09  30667600                  0   \n\n            Buy_Sell_on_Open  Buy_Sell   Returns  \nDate                                              \n2014-01-03                 1         1  0.012658  \n2014-01-06                 1         1  0.032500  \n2014-01-07                 1         0  0.012106  \n2014-01-08                 0         0  0.000000  \n2014-01-09                 0         1 -0.021531  ",
            "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>Open</th>\n      <th>High</th>\n      <th>Low</th>\n      <th>Close</th>\n      <th>Adj Close</th>\n      <th>Volume</th>\n      <th>Increase_Decrease</th>\n      <th>Buy_Sell_on_Open</th>\n      <th>Buy_Sell</th>\n      <th>Returns</th>\n    </tr>\n    <tr>\n      <th>Date</th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>2014-01-03</th>\n      <td>3.98</td>\n      <td>4.00</td>\n      <td>3.88</td>\n      <td>4.00</td>\n      <td>4.00</td>\n      <td>22887200</td>\n      <td>1</td>\n      <td>1</td>\n      <td>1</td>\n      <td>0.012658</td>\n    </tr>\n    <tr>\n      <th>2014-01-06</th>\n      <td>4.01</td>\n      <td>4.18</td>\n      <td>3.99</td>\n      <td>4.13</td>\n      <td>4.13</td>\n      <td>42398300</td>\n      <td>1</td>\n      <td>1</td>\n      <td>1</td>\n      <td>0.032500</td>\n    </tr>\n    <tr>\n      <th>2014-01-07</th>\n      <td>4.19</td>\n      <td>4.25</td>\n      <td>4.11</td>\n      <td>4.18</td>\n      <td>4.18</td>\n      <td>42932100</td>\n      <td>0</td>\n      <td>1</td>\n      <td>0</td>\n      <td>0.012106</td>\n    </tr>\n    <tr>\n      <th>2014-01-08</th>\n      <td>4.23</td>\n      <td>4.26</td>\n      <td>4.14</td>\n      <td>4.18</td>\n      <td>4.18</td>\n      <td>30678700</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0.000000</td>\n    </tr>\n    <tr>\n      <th>2014-01-09</th>\n      <td>4.20</td>\n      <td>4.23</td>\n      <td>4.05</td>\n      <td>4.09</td>\n      <td>4.09</td>\n      <td>30667600</td>\n      <td>0</td>\n      <td>0</td>\n      <td>1</td>\n      <td>-0.021531</td>\n    </tr>\n  </tbody>\n</table>\n</div>"
          },
          "metadata": {}
        }
      ],
      "execution_count": 4,
      "metadata": {
        "collapsed": true,
        "jupyter": {
          "source_hidden": false,
          "outputs_hidden": false
        },
        "nteract": {
          "transient": {
            "deleting": false
          }
        },
        "execution": {
          "shell.execute_reply": "2022-06-02T01:53:32.266Z",
          "iopub.status.busy": "2022-06-02T01:53:32.183Z",
          "iopub.execute_input": "2022-06-02T01:53:32.187Z",
          "iopub.status.idle": "2022-06-02T01:53:32.199Z"
        }
      }
    },
    {
      "cell_type": "code",
      "source": [
        "dataset.tail()"
      ],
      "outputs": [
        {
          "output_type": "execute_result",
          "execution_count": 5,
          "data": {
            "text/plain": "                 Open   High        Low      Close  Adj Close     Volume  \\\nDate                                                                       \n2018-08-20  19.790001  20.08  19.350000  19.980000  19.980000   62983200   \n2018-08-21  19.980000  20.42  19.860001  20.400000  20.400000   55629000   \n2018-08-22  20.280001  20.92  20.209999  20.900000  20.900000   62002700   \n2018-08-23  21.190001  22.32  21.139999  22.290001  22.290001  113444100   \n2018-08-24  22.910000  24.00  22.670000  23.980000  23.980000  164328200   \n\n            Increase_Decrease  Buy_Sell_on_Open  Buy_Sell   Returns  \nDate                                                                 \n2018-08-20                  0                 1         1  0.010622  \n2018-08-21                  1                 1         1  0.021021  \n2018-08-22                  1                 1         1  0.024510  \n2018-08-23                  1                 1         1  0.066507  \n2018-08-24                  0                 0         0  0.075819  ",
            "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>Open</th>\n      <th>High</th>\n      <th>Low</th>\n      <th>Close</th>\n      <th>Adj Close</th>\n      <th>Volume</th>\n      <th>Increase_Decrease</th>\n      <th>Buy_Sell_on_Open</th>\n      <th>Buy_Sell</th>\n      <th>Returns</th>\n    </tr>\n    <tr>\n      <th>Date</th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n      <th></th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>2018-08-20</th>\n      <td>19.790001</td>\n      <td>20.08</td>\n      <td>19.350000</td>\n      <td>19.980000</td>\n      <td>19.980000</td>\n      <td>62983200</td>\n      <td>0</td>\n      <td>1</td>\n      <td>1</td>\n      <td>0.010622</td>\n    </tr>\n    <tr>\n      <th>2018-08-21</th>\n      <td>19.980000</td>\n      <td>20.42</td>\n      <td>19.860001</td>\n      <td>20.400000</td>\n      <td>20.400000</td>\n      <td>55629000</td>\n      <td>1</td>\n      <td>1</td>\n      <td>1</td>\n      <td>0.021021</td>\n    </tr>\n    <tr>\n      <th>2018-08-22</th>\n      <td>20.280001</td>\n      <td>20.92</td>\n      <td>20.209999</td>\n      <td>20.900000</td>\n      <td>20.900000</td>\n      <td>62002700</td>\n      <td>1</td>\n      <td>1</td>\n      <td>1</td>\n      <td>0.024510</td>\n    </tr>\n    <tr>\n      <th>2018-08-23</th>\n      <td>21.190001</td>\n      <td>22.32</td>\n      <td>21.139999</td>\n      <td>22.290001</td>\n      <td>22.290001</td>\n      <td>113444100</td>\n      <td>1</td>\n      <td>1</td>\n      <td>1</td>\n      <td>0.066507</td>\n    </tr>\n    <tr>\n      <th>2018-08-24</th>\n      <td>22.910000</td>\n      <td>24.00</td>\n      <td>22.670000</td>\n      <td>23.980000</td>\n      <td>23.980000</td>\n      <td>164328200</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>0.075819</td>\n    </tr>\n  </tbody>\n</table>\n</div>"
          },
          "metadata": {}
        }
      ],
      "execution_count": 5,
      "metadata": {
        "collapsed": true,
        "jupyter": {
          "source_hidden": false,
          "outputs_hidden": false
        },
        "nteract": {
          "transient": {
            "deleting": false
          }
        },
        "execution": {
          "shell.execute_reply": "2022-06-02T01:53:32.269Z",
          "iopub.status.busy": "2022-06-02T01:53:32.205Z",
          "iopub.execute_input": "2022-06-02T01:53:32.211Z",
          "iopub.status.idle": "2022-06-02T01:53:32.222Z"
        }
      }
    },
    {
      "cell_type": "code",
      "source": [
        "dataset.shape"
      ],
      "outputs": [
        {
          "output_type": "execute_result",
          "execution_count": 6,
          "data": {
            "text/plain": "(1170, 10)"
          },
          "metadata": {}
        }
      ],
      "execution_count": 6,
      "metadata": {
        "collapsed": true,
        "jupyter": {
          "source_hidden": false,
          "outputs_hidden": false
        },
        "nteract": {
          "transient": {
            "deleting": false
          }
        },
        "execution": {
          "shell.execute_reply": "2022-06-02T01:53:32.272Z",
          "iopub.status.busy": "2022-06-02T01:53:32.229Z",
          "iopub.execute_input": "2022-06-02T01:53:32.234Z",
          "iopub.status.idle": "2022-06-02T01:53:32.244Z"
        }
      }
    },
    {
      "cell_type": "code",
      "source": [
        "import torch\n",
        "\n",
        "X = torch.Tensor(dataset[['Open']].values)\n",
        "y = torch.Tensor(dataset[['Adj Close']].values)"
      ],
      "outputs": [],
      "execution_count": 7,
      "metadata": {
        "collapsed": true,
        "jupyter": {
          "source_hidden": false,
          "outputs_hidden": false
        },
        "nteract": {
          "transient": {
            "deleting": false
          }
        },
        "execution": {
          "iopub.status.busy": "2022-06-02T01:53:32.250Z",
          "iopub.execute_input": "2022-06-02T01:53:32.255Z",
          "iopub.status.idle": "2022-06-02T01:53:33.102Z",
          "shell.execute_reply": "2022-06-02T01:53:33.184Z"
        }
      }
    },
    {
      "cell_type": "code",
      "source": [
        "in_features = 1 # number of independent variables\n",
        "out_features = 1 # dimension of predicted variables\n",
        "# bias is default true and can be skipped\n",
        "model = torch.nn.Linear(in_features=in_features, out_features=out_features, bias=True)"
      ],
      "outputs": [],
      "execution_count": 8,
      "metadata": {
        "collapsed": true,
        "jupyter": {
          "source_hidden": false,
          "outputs_hidden": false
        },
        "nteract": {
          "transient": {
            "deleting": false
          }
        },
        "execution": {
          "iopub.status.busy": "2022-06-02T01:53:33.109Z",
          "iopub.execute_input": "2022-06-02T01:53:33.114Z",
          "iopub.status.idle": "2022-06-02T01:53:33.123Z",
          "shell.execute_reply": "2022-06-02T01:53:33.187Z"
        }
      }
    },
    {
      "cell_type": "code",
      "source": [
        "mse_loss = torch.nn.MSELoss()\n",
        "\n",
        "\n"
      ],
      "outputs": [],
      "execution_count": 9,
      "metadata": {
        "collapsed": true,
        "jupyter": {
          "source_hidden": false,
          "outputs_hidden": false
        },
        "nteract": {
          "transient": {
            "deleting": false
          }
        },
        "execution": {
          "iopub.status.busy": "2022-06-02T01:53:33.131Z",
          "iopub.execute_input": "2022-06-02T01:53:33.135Z",
          "iopub.status.idle": "2022-06-02T01:53:33.144Z",
          "shell.execute_reply": "2022-06-02T01:53:33.190Z"
        }
      }
    },
    {
      "cell_type": "code",
      "source": [
        "optimizer = torch.optim.SGD(model.parameters(), lr=0.01)\n"
      ],
      "outputs": [],
      "execution_count": 10,
      "metadata": {
        "collapsed": true,
        "jupyter": {
          "source_hidden": false,
          "outputs_hidden": false
        },
        "nteract": {
          "transient": {
            "deleting": false
          }
        },
        "execution": {
          "iopub.status.busy": "2022-06-02T01:53:33.155Z",
          "iopub.execute_input": "2022-06-02T01:53:33.161Z",
          "iopub.status.idle": "2022-06-02T01:53:33.168Z",
          "shell.execute_reply": "2022-06-02T01:53:33.194Z"
        }
      }
    },
    {
      "cell_type": "code",
      "source": [
        "n_epoch = 500\n",
        "for i in range(n_epoch):\n",
        "    # predict model with current regression parameters\n",
        "    # forward pass (feed the data to model)\n",
        "    y_pred = model(X)\n",
        "    # calculate loss function\n",
        "    step_loss = mse_loss(y_pred, y)\n",
        "        \n",
        "    # Backward to find the derivatives of the loss function with respect to regression parameters\n",
        "    # make any stored gradients to zero\n",
        "    # backward pass (go back and update the regression parameters to minimize the loss)\n",
        "    optimizer.zero_grad()\n",
        "    step_loss.backward()\n",
        "    # update with current step regression parameters \n",
        "    optimizer.step()\n",
        "    print ('epoch [{}], Loss: {:.2f}'.format(i, step_loss.item()))\n"
      ],
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "epoch [0], Loss: 7.77\n",
            "epoch [1], Loss: 1.78\n",
            "epoch [2], Loss: 0.48\n",
            "epoch [3], Loss: 0.20\n",
            "epoch [4], Loss: 0.14\n",
            "epoch [5], Loss: 0.13\n",
            "epoch [6], Loss: 0.12\n",
            "epoch [7], Loss: 0.12\n",
            "epoch [8], Loss: 0.12\n",
            "epoch [9], Loss: 0.12\n",
            "epoch [10], Loss: 0.12\n",
            "epoch [11], Loss: 0.12\n",
            "epoch [12], Loss: 0.12\n",
            "epoch [13], Loss: 0.12\n",
            "epoch [14], Loss: 0.12\n",
            "epoch [15], Loss: 0.12\n",
            "epoch [16], Loss: 0.12\n",
            "epoch [17], Loss: 0.11\n",
            "epoch [18], Loss: 0.11\n",
            "epoch [19], Loss: 0.11\n",
            "epoch [20], Loss: 0.11\n",
            "epoch [21], Loss: 0.11\n",
            "epoch [22], Loss: 0.11\n",
            "epoch [23], Loss: 0.11\n",
            "epoch [24], Loss: 0.11\n",
            "epoch [25], Loss: 0.11\n",
            "epoch [26], Loss: 0.11\n",
            "epoch [27], Loss: 0.11\n",
            "epoch [28], Loss: 0.11\n",
            "epoch [29], Loss: 0.11\n",
            "epoch [30], Loss: 0.11\n",
            "epoch [31], Loss: 0.10\n",
            "epoch [32], Loss: 0.10\n",
            "epoch [33], Loss: 0.10\n",
            "epoch [34], Loss: 0.10\n",
            "epoch [35], Loss: 0.10\n",
            "epoch [36], Loss: 0.10\n",
            "epoch [37], Loss: 0.10\n",
            "epoch [38], Loss: 0.10\n",
            "epoch [39], Loss: 0.10\n",
            "epoch [40], Loss: 0.10\n",
            "epoch [41], Loss: 0.10\n",
            "epoch [42], Loss: 0.10\n",
            "epoch [43], Loss: 0.10\n",
            "epoch [44], Loss: 0.10\n",
            "epoch [45], Loss: 0.10\n",
            "epoch [46], Loss: 0.10\n",
            "epoch [47], Loss: 0.10\n",
            "epoch [48], Loss: 0.09\n",
            "epoch [49], Loss: 0.09\n",
            "epoch [50], Loss: 0.09\n",
            "epoch [51], Loss: 0.09\n",
            "epoch [52], Loss: 0.09\n",
            "epoch [53], Loss: 0.09\n",
            "epoch [54], Loss: 0.09\n",
            "epoch [55], Loss: 0.09\n",
            "epoch [56], Loss: 0.09\n",
            "epoch [57], Loss: 0.09\n",
            "epoch [58], Loss: 0.09\n",
            "epoch [59], Loss: 0.09\n",
            "epoch [60], Loss: 0.09\n",
            "epoch [61], Loss: 0.09\n",
            "epoch [62], Loss: 0.09\n",
            "epoch [63], Loss: 0.09\n",
            "epoch [64], Loss: 0.09\n",
            "epoch [65], Loss: 0.09\n",
            "epoch [66], Loss: 0.09\n",
            "epoch [67], Loss: 0.09\n",
            "epoch [68], Loss: 0.09\n",
            "epoch [69], Loss: 0.09\n",
            "epoch [70], Loss: 0.09\n",
            "epoch [71], Loss: 0.08\n",
            "epoch [72], Loss: 0.08\n",
            "epoch [73], Loss: 0.08\n",
            "epoch [74], Loss: 0.08\n",
            "epoch [75], Loss: 0.08\n",
            "epoch [76], Loss: 0.08\n",
            "epoch [77], Loss: 0.08\n",
            "epoch [78], Loss: 0.08\n",
            "epoch [79], Loss: 0.08\n",
            "epoch [80], Loss: 0.08\n",
            "epoch [81], Loss: 0.08\n",
            "epoch [82], Loss: 0.08\n",
            "epoch [83], Loss: 0.08\n",
            "epoch [84], Loss: 0.08\n",
            "epoch [85], Loss: 0.08\n",
            "epoch [86], Loss: 0.08\n",
            "epoch [87], Loss: 0.08\n",
            "epoch [88], Loss: 0.08\n",
            "epoch [89], Loss: 0.08\n",
            "epoch [90], Loss: 0.08\n",
            "epoch [91], Loss: 0.08\n",
            "epoch [92], Loss: 0.08\n",
            "epoch [93], Loss: 0.08\n",
            "epoch [94], Loss: 0.08\n",
            "epoch [95], Loss: 0.08\n",
            "epoch [96], Loss: 0.08\n",
            "epoch [97], Loss: 0.08\n",
            "epoch [98], Loss: 0.08\n",
            "epoch [99], Loss: 0.08\n",
            "epoch [100], Loss: 0.08\n",
            "epoch [101], Loss: 0.08\n",
            "epoch [102], Loss: 0.08\n",
            "epoch [103], Loss: 0.07\n",
            "epoch [104], Loss: 0.07\n",
            "epoch [105], Loss: 0.07\n",
            "epoch [106], Loss: 0.07\n",
            "epoch [107], Loss: 0.07\n",
            "epoch [108], Loss: 0.07\n",
            "epoch [109], Loss: 0.07\n",
            "epoch [110], Loss: 0.07\n",
            "epoch [111], Loss: 0.07\n",
            "epoch [112], Loss: 0.07\n",
            "epoch [113], Loss: 0.07\n",
            "epoch [114], Loss: 0.07\n",
            "epoch [115], Loss: 0.07\n",
            "epoch [116], Loss: 0.07\n",
            "epoch [117], Loss: 0.07\n",
            "epoch [118], Loss: 0.07\n",
            "epoch [119], Loss: 0.07\n",
            "epoch [120], Loss: 0.07\n",
            "epoch [121], Loss: 0.07\n",
            "epoch [122], Loss: 0.07\n",
            "epoch [123], Loss: 0.07\n",
            "epoch [124], Loss: 0.07\n",
            "epoch [125], Loss: 0.07\n",
            "epoch [126], Loss: 0.07\n",
            "epoch [127], Loss: 0.07\n",
            "epoch [128], Loss: 0.07\n",
            "epoch [129], Loss: 0.07\n",
            "epoch [130], Loss: 0.07\n",
            "epoch [131], Loss: 0.07\n",
            "epoch [132], Loss: 0.07\n",
            "epoch [133], Loss: 0.07\n",
            "epoch [134], Loss: 0.07\n",
            "epoch [135], Loss: 0.07\n",
            "epoch [136], Loss: 0.07\n",
            "epoch [137], Loss: 0.07\n",
            "epoch [138], Loss: 0.07\n",
            "epoch [139], Loss: 0.07\n",
            "epoch [140], Loss: 0.07\n",
            "epoch [141], Loss: 0.07\n",
            "epoch [142], Loss: 0.07\n",
            "epoch [143], Loss: 0.07\n",
            "epoch [144], Loss: 0.07\n",
            "epoch [145], Loss: 0.07\n",
            "epoch [146], Loss: 0.07\n",
            "epoch [147], Loss: 0.07\n",
            "epoch [148], Loss: 0.07\n",
            "epoch [149], Loss: 0.07\n",
            "epoch [150], Loss: 0.07\n",
            "epoch [151], Loss: 0.07\n",
            "epoch [152], Loss: 0.07\n",
            "epoch [153], Loss: 0.07\n",
            "epoch [154], Loss: 0.07\n",
            "epoch [155], Loss: 0.07\n",
            "epoch [156], Loss: 0.07\n",
            "epoch [157], Loss: 0.06\n",
            "epoch [158], Loss: 0.06\n",
            "epoch [159], Loss: 0.06\n",
            "epoch [160], Loss: 0.06\n",
            "epoch [161], Loss: 0.06\n",
            "epoch [162], Loss: 0.06\n",
            "epoch [163], Loss: 0.06\n",
            "epoch [164], Loss: 0.06\n",
            "epoch [165], Loss: 0.06\n",
            "epoch [166], Loss: 0.06\n",
            "epoch [167], Loss: 0.06\n",
            "epoch [168], Loss: 0.06\n",
            "epoch [169], Loss: 0.06\n",
            "epoch [170], Loss: 0.06\n",
            "epoch [171], Loss: 0.06\n",
            "epoch [172], Loss: 0.06\n",
            "epoch [173], Loss: 0.06\n",
            "epoch [174], Loss: 0.06\n",
            "epoch [175], Loss: 0.06\n",
            "epoch [176], Loss: 0.06\n",
            "epoch [177], Loss: 0.06\n",
            "epoch [178], Loss: 0.06\n",
            "epoch [179], Loss: 0.06\n",
            "epoch [180], Loss: 0.06\n",
            "epoch [181], Loss: 0.06\n",
            "epoch [182], Loss: 0.06\n",
            "epoch [183], Loss: 0.06\n",
            "epoch [184], Loss: 0.06\n",
            "epoch [185], Loss: 0.06\n",
            "epoch [186], Loss: 0.06\n",
            "epoch [187], Loss: 0.06\n",
            "epoch [188], Loss: 0.06\n",
            "epoch [189], Loss: 0.06\n",
            "epoch [190], Loss: 0.06\n",
            "epoch [191], Loss: 0.06\n",
            "epoch [192], Loss: 0.06\n",
            "epoch [193], Loss: 0.06\n",
            "epoch [194], Loss: 0.06\n",
            "epoch [195], Loss: 0.06\n",
            "epoch [196], Loss: 0.06\n",
            "epoch [197], Loss: 0.06\n",
            "epoch [198], Loss: 0.06\n",
            "epoch [199], Loss: 0.06\n",
            "epoch [200], Loss: 0.06\n",
            "epoch [201], Loss: 0.06\n",
            "epoch [202], Loss: 0.06\n",
            "epoch [203], Loss: 0.06\n",
            "epoch [204], Loss: 0.06\n",
            "epoch [205], Loss: 0.06\n",
            "epoch [206], Loss: 0.06\n",
            "epoch [207], Loss: 0.06\n",
            "epoch [208], Loss: 0.06\n",
            "epoch [209], Loss: 0.06\n",
            "epoch [210], Loss: 0.06\n",
            "epoch [211], Loss: 0.06\n",
            "epoch [212], Loss: 0.06\n",
            "epoch [213], Loss: 0.06\n",
            "epoch [214], Loss: 0.06\n",
            "epoch [215], Loss: 0.06\n",
            "epoch [216], Loss: 0.06\n",
            "epoch [217], Loss: 0.06\n",
            "epoch [218], Loss: 0.06\n",
            "epoch [219], Loss: 0.06\n",
            "epoch [220], Loss: 0.06\n",
            "epoch [221], Loss: 0.06\n",
            "epoch [222], Loss: 0.06\n",
            "epoch [223], Loss: 0.06\n",
            "epoch [224], Loss: 0.06\n",
            "epoch [225], Loss: 0.06\n",
            "epoch [226], Loss: 0.06\n",
            "epoch [227], Loss: 0.06\n",
            "epoch [228], Loss: 0.06\n",
            "epoch [229], Loss: 0.06\n",
            "epoch [230], Loss: 0.06\n",
            "epoch [231], Loss: 0.06\n",
            "epoch [232], Loss: 0.06\n",
            "epoch [233], Loss: 0.06\n",
            "epoch [234], Loss: 0.06\n",
            "epoch [235], Loss: 0.06\n",
            "epoch [236], Loss: 0.06\n",
            "epoch [237], Loss: 0.06\n",
            "epoch [238], Loss: 0.06\n",
            "epoch [239], Loss: 0.06\n",
            "epoch [240], Loss: 0.06\n",
            "epoch [241], Loss: 0.06\n",
            "epoch [242], Loss: 0.06\n",
            "epoch [243], Loss: 0.06\n",
            "epoch [244], Loss: 0.06\n",
            "epoch [245], Loss: 0.06\n",
            "epoch [246], Loss: 0.06\n",
            "epoch [247], Loss: 0.06\n",
            "epoch [248], Loss: 0.06\n",
            "epoch [249], Loss: 0.06\n",
            "epoch [250], Loss: 0.06\n",
            "epoch [251], Loss: 0.06\n",
            "epoch [252], Loss: 0.06\n",
            "epoch [253], Loss: 0.06\n",
            "epoch [254], Loss: 0.06\n",
            "epoch [255], Loss: 0.06\n",
            "epoch [256], Loss: 0.06\n",
            "epoch [257], Loss: 0.06\n",
            "epoch [258], Loss: 0.06\n",
            "epoch [259], Loss: 0.06\n",
            "epoch [260], Loss: 0.06\n",
            "epoch [261], Loss: 0.06\n",
            "epoch [262], Loss: 0.06\n",
            "epoch [263], Loss: 0.06\n",
            "epoch [264], Loss: 0.06\n",
            "epoch [265], Loss: 0.06\n",
            "epoch [266], Loss: 0.06\n",
            "epoch [267], Loss: 0.06\n",
            "epoch [268], Loss: 0.06\n",
            "epoch [269], Loss: 0.06\n",
            "epoch [270], Loss: 0.06\n",
            "epoch [271], Loss: 0.06\n",
            "epoch [272], Loss: 0.06\n",
            "epoch [273], Loss: 0.06\n",
            "epoch [274], Loss: 0.06\n",
            "epoch [275], Loss: 0.06\n",
            "epoch [276], Loss: 0.06\n",
            "epoch [277], Loss: 0.06\n",
            "epoch [278], Loss: 0.06\n",
            "epoch [279], Loss: 0.06\n",
            "epoch [280], Loss: 0.06\n",
            "epoch [281], Loss: 0.06\n",
            "epoch [282], Loss: 0.06\n",
            "epoch [283], Loss: 0.06\n",
            "epoch [284], Loss: 0.06\n",
            "epoch [285], Loss: 0.06\n",
            "epoch [286], Loss: 0.06\n",
            "epoch [287], Loss: 0.06\n",
            "epoch [288], Loss: 0.06\n",
            "epoch [289], Loss: 0.06\n",
            "epoch [290], Loss: 0.06\n",
            "epoch [291], Loss: 0.06\n",
            "epoch [292], Loss: 0.06\n",
            "epoch [293], Loss: 0.06\n",
            "epoch [294], Loss: 0.06\n",
            "epoch [295], Loss: 0.06\n",
            "epoch [296], Loss: 0.06\n",
            "epoch [297], Loss: 0.06\n",
            "epoch [298], Loss: 0.06\n",
            "epoch [299], Loss: 0.06\n",
            "epoch [300], Loss: 0.06\n",
            "epoch [301], Loss: 0.06\n",
            "epoch [302], Loss: 0.06\n",
            "epoch [303], Loss: 0.06\n",
            "epoch [304], Loss: 0.06\n",
            "epoch [305], Loss: 0.06\n",
            "epoch [306], Loss: 0.06\n",
            "epoch [307], Loss: 0.06\n",
            "epoch [308], Loss: 0.06\n",
            "epoch [309], Loss: 0.06\n",
            "epoch [310], Loss: 0.06\n",
            "epoch [311], Loss: 0.06\n",
            "epoch [312], Loss: 0.06\n",
            "epoch [313], Loss: 0.06\n",
            "epoch [314], Loss: 0.06\n",
            "epoch [315], Loss: 0.06\n",
            "epoch [316], Loss: 0.06\n",
            "epoch [317], Loss: 0.06\n",
            "epoch [318], Loss: 0.06\n",
            "epoch [319], Loss: 0.06\n",
            "epoch [320], Loss: 0.06\n",
            "epoch [321], Loss: 0.06\n",
            "epoch [322], Loss: 0.06\n",
            "epoch [323], Loss: 0.06\n",
            "epoch [324], Loss: 0.06\n",
            "epoch [325], Loss: 0.06\n",
            "epoch [326], Loss: 0.06\n",
            "epoch [327], Loss: 0.06\n",
            "epoch [328], Loss: 0.06\n",
            "epoch [329], Loss: 0.06\n",
            "epoch [330], Loss: 0.06\n",
            "epoch [331], Loss: 0.06\n",
            "epoch [332], Loss: 0.06\n",
            "epoch [333], Loss: 0.06\n",
            "epoch [334], Loss: 0.06\n",
            "epoch [335], Loss: 0.06\n",
            "epoch [336], Loss: 0.06\n",
            "epoch [337], Loss: 0.06\n",
            "epoch [338], Loss: 0.06\n",
            "epoch [339], Loss: 0.06\n",
            "epoch [340], Loss: 0.06\n",
            "epoch [341], Loss: 0.06\n",
            "epoch [342], Loss: 0.06\n",
            "epoch [343], Loss: 0.06\n",
            "epoch [344], Loss: 0.06\n",
            "epoch [345], Loss: 0.06\n",
            "epoch [346], Loss: 0.06\n",
            "epoch [347], Loss: 0.06\n",
            "epoch [348], Loss: 0.06\n",
            "epoch [349], Loss: 0.06\n",
            "epoch [350], Loss: 0.06\n",
            "epoch [351], Loss: 0.06\n",
            "epoch [352], Loss: 0.06\n",
            "epoch [353], Loss: 0.06\n",
            "epoch [354], Loss: 0.06\n",
            "epoch [355], Loss: 0.06\n",
            "epoch [356], Loss: 0.06\n",
            "epoch [357], Loss: 0.06\n",
            "epoch [358], Loss: 0.06\n",
            "epoch [359], Loss: 0.06\n",
            "epoch [360], Loss: 0.06\n",
            "epoch [361], Loss: 0.06\n",
            "epoch [362], Loss: 0.06\n",
            "epoch [363], Loss: 0.06\n",
            "epoch [364], Loss: 0.06\n",
            "epoch [365], Loss: 0.06\n",
            "epoch [366], Loss: 0.06\n",
            "epoch [367], Loss: 0.06\n",
            "epoch [368], Loss: 0.06\n",
            "epoch [369], Loss: 0.06\n",
            "epoch [370], Loss: 0.06\n",
            "epoch [371], Loss: 0.06\n",
            "epoch [372], Loss: 0.06\n",
            "epoch [373], Loss: 0.06\n",
            "epoch [374], Loss: 0.06\n",
            "epoch [375], Loss: 0.06\n",
            "epoch [376], Loss: 0.06\n",
            "epoch [377], Loss: 0.06\n",
            "epoch [378], Loss: 0.06\n",
            "epoch [379], Loss: 0.06\n",
            "epoch [380], Loss: 0.06\n",
            "epoch [381], Loss: 0.06\n",
            "epoch [382], Loss: 0.06\n",
            "epoch [383], Loss: 0.06\n",
            "epoch [384], Loss: 0.06\n",
            "epoch [385], Loss: 0.06\n",
            "epoch [386], Loss: 0.06\n",
            "epoch [387], Loss: 0.06\n",
            "epoch [388], Loss: 0.06\n",
            "epoch [389], Loss: 0.06\n",
            "epoch [390], Loss: 0.06\n",
            "epoch [391], Loss: 0.06\n",
            "epoch [392], Loss: 0.06\n",
            "epoch [393], Loss: 0.06\n",
            "epoch [394], Loss: 0.06\n",
            "epoch [395], Loss: 0.06\n",
            "epoch [396], Loss: 0.06\n",
            "epoch [397], Loss: 0.06\n",
            "epoch [398], Loss: 0.06\n",
            "epoch [399], Loss: 0.06\n",
            "epoch [400], Loss: 0.06\n",
            "epoch [401], Loss: 0.06\n",
            "epoch [402], Loss: 0.06\n",
            "epoch [403], Loss: 0.06\n",
            "epoch [404], Loss: 0.06\n",
            "epoch [405], Loss: 0.06\n",
            "epoch [406], Loss: 0.06\n",
            "epoch [407], Loss: 0.06\n",
            "epoch [408], Loss: 0.06\n",
            "epoch [409], Loss: 0.06\n",
            "epoch [410], Loss: 0.06\n",
            "epoch [411], Loss: 0.06\n",
            "epoch [412], Loss: 0.06\n",
            "epoch [413], Loss: 0.06\n",
            "epoch [414], Loss: 0.06\n",
            "epoch [415], Loss: 0.06\n",
            "epoch [416], Loss: 0.06\n",
            "epoch [417], Loss: 0.06\n",
            "epoch [418], Loss: 0.06\n",
            "epoch [419], Loss: 0.06\n",
            "epoch [420], Loss: 0.06\n",
            "epoch [421], Loss: 0.06\n",
            "epoch [422], Loss: 0.06\n",
            "epoch [423], Loss: 0.06\n",
            "epoch [424], Loss: 0.06\n",
            "epoch [425], Loss: 0.06\n",
            "epoch [426], Loss: 0.06\n",
            "epoch [427], Loss: 0.06\n",
            "epoch [428], Loss: 0.06\n",
            "epoch [429], Loss: 0.06\n",
            "epoch [430], Loss: 0.06\n",
            "epoch [431], Loss: 0.06\n",
            "epoch [432], Loss: 0.06\n",
            "epoch [433], Loss: 0.06\n",
            "epoch [434], Loss: 0.06\n",
            "epoch [435], Loss: 0.06\n",
            "epoch [436], Loss: 0.06\n",
            "epoch [437], Loss: 0.06\n",
            "epoch [438], Loss: 0.06\n",
            "epoch [439], Loss: 0.06\n",
            "epoch [440], Loss: 0.06\n",
            "epoch [441], Loss: 0.06\n",
            "epoch [442], Loss: 0.06\n",
            "epoch [443], Loss: 0.06\n",
            "epoch [444], Loss: 0.06\n",
            "epoch [445], Loss: 0.06\n",
            "epoch [446], Loss: 0.06\n",
            "epoch [447], Loss: 0.06\n",
            "epoch [448], Loss: 0.06\n",
            "epoch [449], Loss: 0.06\n",
            "epoch [450], Loss: 0.06\n",
            "epoch [451], Loss: 0.06\n",
            "epoch [452], Loss: 0.06\n",
            "epoch [453], Loss: 0.06\n",
            "epoch [454], Loss: 0.06\n",
            "epoch [455], Loss: 0.06\n",
            "epoch [456], Loss: 0.06\n",
            "epoch [457], Loss: 0.06\n",
            "epoch [458], Loss: 0.06\n",
            "epoch [459], Loss: 0.06\n",
            "epoch [460], Loss: 0.06\n",
            "epoch [461], Loss: 0.06\n",
            "epoch [462], Loss: 0.06\n",
            "epoch [463], Loss: 0.06\n",
            "epoch [464], Loss: 0.06\n",
            "epoch [465], Loss: 0.06\n",
            "epoch [466], Loss: 0.06\n",
            "epoch [467], Loss: 0.06\n",
            "epoch [468], Loss: 0.06\n",
            "epoch [469], Loss: 0.06\n",
            "epoch [470], Loss: 0.06\n",
            "epoch [471], Loss: 0.06\n",
            "epoch [472], Loss: 0.06\n",
            "epoch [473], Loss: 0.06\n",
            "epoch [474], Loss: 0.06\n",
            "epoch [475], Loss: 0.06\n",
            "epoch [476], Loss: 0.06\n",
            "epoch [477], Loss: 0.06\n",
            "epoch [478], Loss: 0.06\n",
            "epoch [479], Loss: 0.06\n",
            "epoch [480], Loss: 0.06\n",
            "epoch [481], Loss: 0.06\n",
            "epoch [482], Loss: 0.06\n",
            "epoch [483], Loss: 0.06\n",
            "epoch [484], Loss: 0.06\n",
            "epoch [485], Loss: 0.06\n",
            "epoch [486], Loss: 0.06\n",
            "epoch [487], Loss: 0.06\n",
            "epoch [488], Loss: 0.06\n",
            "epoch [489], Loss: 0.06\n",
            "epoch [490], Loss: 0.06\n",
            "epoch [491], Loss: 0.06\n",
            "epoch [492], Loss: 0.06\n",
            "epoch [493], Loss: 0.06\n",
            "epoch [494], Loss: 0.06\n",
            "epoch [495], Loss: 0.06\n",
            "epoch [496], Loss: 0.06\n",
            "epoch [497], Loss: 0.06\n",
            "epoch [498], Loss: 0.06\n",
            "epoch [499], Loss: 0.06\n"
          ]
        }
      ],
      "execution_count": 11,
      "metadata": {
        "collapsed": true,
        "jupyter": {
          "source_hidden": false,
          "outputs_hidden": false
        },
        "nteract": {
          "transient": {
            "deleting": false
          }
        },
        "execution": {
          "iopub.status.busy": "2022-06-02T01:53:33.175Z",
          "iopub.execute_input": "2022-06-02T01:53:33.179Z",
          "shell.execute_reply": "2022-06-02T01:53:33.342Z",
          "iopub.status.idle": "2022-06-02T01:53:33.299Z"
        }
      }
    },
    {
      "cell_type": "code",
      "source": [
        "# bias b (y-intercept)\n",
        "print(\"y-intercept:\", model.bias.item())\n",
        "# weight (w)\n",
        "print(\"weight:\", model.weight.item())\n",
        "\n"
      ],
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "y-intercept: -0.017851166427135468\n",
            "weight: 1.001890778541565\n"
          ]
        }
      ],
      "execution_count": 12,
      "metadata": {
        "collapsed": true,
        "jupyter": {
          "source_hidden": false,
          "outputs_hidden": false
        },
        "nteract": {
          "transient": {
            "deleting": false
          }
        },
        "execution": {
          "shell.execute_reply": "2022-06-02T01:53:33.346Z",
          "iopub.status.busy": "2022-06-02T01:53:33.308Z",
          "iopub.execute_input": "2022-06-02T01:53:33.313Z",
          "iopub.status.idle": "2022-06-02T01:53:33.323Z"
        }
      }
    },
    {
      "cell_type": "code",
      "source": [
        "from sklearn.metrics import r2_score\n",
        "r2_score(y_true=y, y_pred=y_pred.detach().numpy())"
      ],
      "outputs": [
        {
          "output_type": "execute_result",
          "execution_count": 13,
          "data": {
            "text/plain": "0.9976532042733818"
          },
          "metadata": {}
        }
      ],
      "execution_count": 13,
      "metadata": {
        "collapsed": true,
        "jupyter": {
          "source_hidden": false,
          "outputs_hidden": false
        },
        "nteract": {
          "transient": {
            "deleting": false
          }
        },
        "execution": {
          "iopub.status.busy": "2022-06-02T01:53:33.332Z",
          "iopub.execute_input": "2022-06-02T01:53:33.337Z",
          "iopub.status.idle": "2022-06-02T01:53:33.599Z",
          "shell.execute_reply": "2022-06-02T01:53:33.620Z"
        }
      }
    },
    {
      "cell_type": "code",
      "source": [
        "from bioinfokit import visuz"
      ],
      "outputs": [],
      "execution_count": 14,
      "metadata": {
        "collapsed": true,
        "jupyter": {
          "source_hidden": false,
          "outputs_hidden": false
        },
        "nteract": {
          "transient": {
            "deleting": false
          }
        },
        "execution": {
          "iopub.status.busy": "2022-06-02T01:53:33.608Z",
          "iopub.execute_input": "2022-06-02T01:53:33.613Z",
          "shell.execute_reply": "2022-06-02T01:53:33.682Z",
          "iopub.status.idle": "2022-06-02T01:53:33.690Z"
        }
      }
    },
    {
      "cell_type": "code",
      "source": [
        "y_pred = model(X).detach()\n",
        "dataset['yhat']=y_pred.numpy()\n",
        "visuz.stat.regplot(df=dataset, x='Open', y='Adj Close', yhat='yhat', show=True)"
      ],
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": "<Figure size 432x288 with 1 Axes>",
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXsAAAEHCAYAAABP3uaxAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAA07ElEQVR4nO3deXiTVfbA8e/tkhRauhJwbIFSqoKsIoIMuzKjo4igowKjoj/ZZBVBXMcVRdkUWVQEdVzAZcQZRUdHHREBlU0BBVSILEWhpUvSAk3S9v7+yNK0TUuBpkmT83keHvrm3W5jPLmc995zldYaIYQQoS0i0A0QQgjhfxLshRAiDEiwF0KIMCDBXgghwoAEeyGECAMS7IUQIgxE+eOiSqlGwAogCSgGRgLbgN2uQ6Zprbf4495CCCGqUv4YZ6+UGgPEa63nKqVGAc2AP2itJ9X5zYQQQpyUX3r2OHv1ZV73sAHdlVJrgc3AdK11WXUnN23aVKenp/upaUIIEZq2bNlyVGtt8rXPLz17z8WVagu8BTwMFGmtP1VKLQS+1lqvqHTsGGAMQMuWLS/cv3+/39olhBChSCm1RWvdzdc+vz2gVUp1AVYCw4BPgC9cuz4COlQ+Xmu9VGvdTWvdzWTy+cUkhBDiNPkl2CulWgKvAn/VWu8CZgLXuXb3Bbb7475CCCF881fP/i6gCbBcKbUGsACjXD8nA+/46b5CCCF88MsDWteomzodeeNwOMjKyqK4uLguLytOU0xMDGlpaURHRwe6KUKIWvDXaJw6l5WVRZMmTUhPT0cpFejmhDWtNbm5uWRlZdG6detAN0cIUQsNZgZtcXExKSkpEuiDgFKKlJQU+VeWEA1Igwn2gAT6ICL/LYSoe8U2G3v27qXYZqvzazeoYF+f9u3bR1JSEv3796dHjx4888wzAW3PK6+8wqeffnpG1+jfvz9ZWVkcPnyYadOm1VHLhBB1odhmY8Kkicy49x4mTJpY5wG/weTsA+HCCy/ks88+o7S0lPPPP5/Ro0cTGxt7WtcqKysjIuL0v1tvueWW0z63srPOOot58+bV2fWEEGcuKyuL/IICbDYb+QUFZGVlkdmmTZ1dX3r2tXD8+HHsdjulpaU4HA5GjRrFgAED6N27Nxs3bgRgzZo1dOnShcGDB3PdddfxyiuvAJCZmcl9993HpZdeisVi4frrr+fSSy/lkksuYc+ePWitGTFiBH369GHAgAGsXbuWH3/8kZ49ezJgwAD+8pe/APDwww/z+uuvA/Diiy/So0cPevTowUsvvQQ4e/5DhgzhmmuuoUOHDnz11VfV/j779u1j4MCBnuv+7W9/Y/DgwXTp0oXdu5216r788kv69etH//79GTduHLJWsRD+lZaWRlJiIkajkaTERNLS0ur0+g2yZ6/n3Fln11J3za9235YtW+jXrx/btm3jgQceID4+nueff57MzEyWLVvGkSNHuOaaa1i/fj3Tpk3jgw8+IC0tjcsuu8xzjZKSEq666iqeeOIJ7rnnHq655hqGDRvGtm3buOeee3jhhRfYv38/69atQylFWVkZzzzzDLfeeitjxoyhrKxiCaGcnBwWLVrEpk2bALjooou46qqrPPtXrVrFhg0bmD9/Pn369KnVe2AymXjjjTdYsWIFy5YtY86cOdxxxx2sWbOGhIQEpk6dyocffsigQYNO5a0VQpyCGKORxQsXkZWVRVpaGjFGY51ev0EG+5oCdF1yp3G2bdvG3XffzfTp09mxYwcbNmzg448/BsBisQBQWFhIixYtAOjevbvnGpGRkVx88cUA7Nixgy+//JLnn38egKioKFJSUhg9ejQ33XQTjRs35sEHH+TWW2/l8ccf529/+xudOnXi7rvv9lzPbDbTsWNHDAYDAB07duTXX3/1tBegZcuW5ObmntLv6T7v008/5ejRo+zbt4+rr74agKKiIs4777xTfPeEEKcqxmis09SNtwYZ7Otb586dOfvss/noo49o3749mZmZTJ06FQC73Q5AXFyc5xt58+bNZGZmAs5RK+6RK+3bt6dnz54MHTrUc67D4eDGG2/klltu4fXXX+fpp5/mscceY+7cuQAMHDiQK664wtOW1q1bs337ds99d+zYQevWrdm5c2eFETKnknapfF7Tpk3JyMhg9erVxMXFAc5JbUKIhkuCfS1NnTqVCRMm8PnnnzNp0iQGDBgAQLdu3ZgzZw5z585l0KBBpKamEhMT4+l5e7v//vsZN24cCxcuRGvNlVdeyfDhwxk2bBiRkZHY7XaeffZZVq5cySuvvIJSirPOOqtCr7pZs2aMHz+e3r17AzBx4kTqunCcUor58+czePBgtNZERETw9NNP06lTpzq9jxCi/vi1xPHp6tatm968eXOF13bt2kW7du0C1KKTczgcREdHo7Xm8ssv5/HHH6dbN5+VRkNGsP83ESLcBKTEcbj55JNP6NevH927d+f8888P+UAvhGhYJI1TRwYNGiSjVYQQZ0TbbRAdjVJ13w+XYC+EEAGmtYanZ0BpKVx+A3TsUef3kGAvhBABpHdshI/fdG6kn4fyQ6AHCfZCCBEQuvgELLy//IVJM1Exjf12P3lAW4NNmzZxySWX0K9fPwYMGOCZtepdbiCQ1q1bd9KaOaNGjWLNmjXV7l+zZg3bt8sqkULUJ71qWXmg//N1qLvm+zXQg/Tsq2WxWBg5ciQfffQR6enp7Nu3jyuuuIKvv/66Tu9TWlpKZGRknV7zVKxZs4bMzEwZQy/ESRTbbGdcykD/tg/eeNa5oRRMm1tv5cKlZ1+N1atXM2TIENLT0wFIT0/n6quvZvXq1QDk5eVxww030K1bNxYsWADAm2++Sffu3RkwYAD33nsv4Lug2L59+7jooou46aabGD16ND179uTo0aMArF+/3tNbX7hwIX369KFnz54sW7YMgN9//51+/fpx+eWX8+KLL/ps+zvvvEOXLl0YOnQoe/fu9bx+2WWX0b9/f7p3787XX39NXl4er7zyCo8//jj9+/entLSUkSNH0r9/f7p27cr7779f5++rEA3RmZYf1mVlzppe7kB/6wzU9Hn1ui5ESPbs6+IbOCsri5YtW1Z4rVWrVhw6dAiAgwcP8uWXXxITE8NFF13E8OHDWbFiBa+//jrnnnsuZWVlaK19FhTr0KED+/bt4/PPPyc+Pp4FCxawcuVKJk2axGuvvcbNN9/Mrl27+Pjjj1m7di1lZWX06dOHoUOH8uSTTzJu3DiGDx/O448/zi+//FKhjaWlpdx///1s2bKFmJgYOnfu7Nm3atUqYmNj2bVrFxMmTOB///sft9xyC5mZmdx4440ALFmyhNjYWHJzc+nXrx+DBw8+rfdPiFByJuWH9TefwVcfOTc6XYy67Ho/trR6IRfs3d/A+QUFJCUmsnjhotMK+KmpqezcubPCawcOHKB9+/YAtG3bliZNmgDQoUMHfv31V2bNmsXcuXM5duwY119/PX/84x99FhTr0KEDHTp0ID4+HoARI0YwZMgQxo4dyzfffMNzzz3HP//5T3bu3Okpy2C1Wjl48CA///wzkydPBqBHjx5Vgv3Ro0dp3ry5p21du3YF4MSJE0yZMoWffvqJyMhIz5eWt7KyMh555BE2bNhAVFQU+/fvP+X3TYhQ5C4/7I4rtSk/rIss8Nwj5S/c8SQqumoZlfoScsG+rhYAuPLKK3niiScYO3YsrVq14sCBA/zrX/9ixowZFBQUsHv3boqKioiJieGHH36gdevWxMXFsXTpUmw2G+eccw779+/3WVDs0KFDFfL0JpOJpk2bMnv2bK688kqUUrRr144LLriAd999F6WUpxzDOeecw+bNm2nTpo3ngbG3pk2bcuTIEU/bvv/+ewA+/vhjIiMj+eqrr9i5c6enx24wGCgpKQFg27ZtbN++nXXr1nH06FHa+Kn6nhANzamWH9Yvz4ajh50bQ/8PldmhHlpZs5AL9qfzDexLUlISL7/8MrfccotnlamXX36ZxMRECgoKSE9PZ/To0fzyyy+MHDmSZs2aMWHCBHbs2IHD4WDs2LHVFhRz9+i93XzzzQwbNowffvgBcP5rYeDAgfTr14/IyEgaNWrE+++/z913383w4cN56aWXaNWqVZXrREZG8uijj9K7d29at25NamoqAD179mTWrFkMHDiQXr16eY7/05/+xB133MHq1at59dVXcTgc9OvXjy5dupCYmHha750Qoag25Yf13p2wyvl8jSQTatS99dCy2gnJQmh1kbMXJyeF0IRw0iUOeLp83QnGPYhqkljv7aipEFrI9ezBvwsACCGEN/3Zu/DdeudGr8tQf7ys5hMCJCSDvRBC+JvOy4blT5a/MG0uKiJ4R7NLsBdCiFNQoWgZwPBJqLTWgW1ULTSoYK+1rtdJCKJ6wfisRwh/0z9shP94FS27bmxgG3QKGkywj4mJITc3l5SUFAn4Aaa1Jjc3l5iYmEA3RYh6oW0n4Nn6K1rmDw0m2KelpZGVlUVOTk6gmyJwfvme7rBWIQLtVEbs6VXLYe+Pzo0/X4fq3LMeWlj3Gkywj46OpnXr4M+LCSGCW21n2VcoWoaC6fVXtMwfGkywF0KIunCyWfa6rAzmTS8/4dYZqKZnBaCldUuCvRAirNQ0y15/+zms/dC50akH6rIbAtTKuifBXggRVnzVuQm2omX+IMFeCBHyKj+Q9Z5lX6Fo2ZD/Q50T+KJl/iDBXggR0qp7IKvNO+FdV9GyxKao0fcFtqF+5pdgr5RqBKwAkoBi4CZgMfAHYCcwTsusHCFEPajyQHb/ftr8+/nyA8b+HRWfFLgG1hN/FXK4CVivte4P/BO4DfhRa90HZ/C/1E/3FUKICtLS0khMSMBgMDA+s3l5oO91mXOh7zAI9OC/NM4KoMzrHrOAfq7tz4A+rr+FEMIv3Hl6k8lE8+gIlnf3WmZ02hxURGT1J4cgvwR7rXURgFKqLXA78BJQ6Np9DIirfI5SagwwBqiy9qsQQng72QxY7zz9igvTeKK1M+Tct+sIt93/KJlhFujBjw9olVJdgJeBYTiDuDvAxwHWysdrrZcCS8G5eIm/2iWEaNiKbTbGT5zgeeC6ZNHiKgE/KyuLzpF2Jl3UAoAdRXYe3nXkjFava+j89YC2JfAqMFRrvVcptQnoD3yFM1//kT/uK4QIfWazmeycHLTWZOfkYDabycjIwGw2A5CRejZtVi1mUkYKAMO+MdM4KYWZjzxKRkZG2K5e56+e/V1AE2C5q5bEe8D5SqkNwG7gv366rxAiBHmnbaC8xLbWGrvdzviJE8jOyeH+ts0xpjiTCL937MP4Za/jKCnDYbViMBjCNtCD/3L2k4BJlV5e4I97CSFCW+Vx8vPnzqN5s2bk5eeTnJSEwWCgqf04y3uV17fZO3Q8aS1akPzuh+Tl55OYkBC26Rs3mVQlhAhqlcfJ5+TksGTRYmdP/+yzMS66n6c6OAuVjd96gOLYBJ5r0cJzfkOuVFmXgnfBRCGEoLxwmdFo9DxgjTEaaXN0H8ZFzgVFPs0uYtC6PRyylTJ82HDA+SVRYLFgt9spsFjIysoK5K8RcNKzF0IEtcqFyzhmRT87y7PfNv5R3po6FYPBQGlJCc8vfYG33n6L+XPnVVvdMhxJsBdCBD134bLSl2YTkessWrbw0HHGPLXA82Xw9Tdfs3Dx4grpnsrVLcOZpHGEEAFTbLOxZ+9eim22Go/T5l3oOXcSkXuY3044GLRuD//d97tnuGWM0UjPi3v6TPdktmkT9oEepGcvhAiQ2iwPqEtK4OkZnu1fLh3O1Ecec+6rVEvRV516UU6CvRAiIE66PODnq2DrOufGH/+M6nU5LW22CsMuMzIyKlzTu069qEiCvRAiILyXB0xMSMBut1Nss2E8ZoHlT5Yf6Cpa5p5Y9fS8+eTk5Ejv/RSpYCwr361bN7158+ZAN0MIUUsnK0xW03lms5m58+dRYLHwxoVpxES4xsUPn4hKy/AcV13K53TvHYqUUlu01t187ZOevRDijNQm916dGKMRg8FA5ygHk11Fy443SyN25J0Vjqsu5XMm9w43MhpHCHFGfAXi2tK2YtqsWsxkV9GyKXsLiRw2ocpxviZWnem9w4307IUQZ8Q7934qk5f0ey/Bnh8AcAwYwoGkVGZXk4qpbqTN6d47HEnOXghxxk4lb65/3w+ve9VFnD7vjOrXSM6+nOTshRB+VZshj1qXwdzp5S/cchfK9Id6ubeQYC+EqAf62//B2tXOjY49UJffENgGhSEJ9kIIv9FFVnju4fIX7ngSFW0IWHvCmQR7IYRf6H/Mg+xDzo0ht6LO6RjYBoU5CfZCiDqlf90F/3zRuZGQjBrzQGAbJAAJ9kKIOlK5aBlj/46KTwpcg0QFEuyFEB6nO4xRf/4ebP3KueEqWiaCiwR7IQRwemUPdH4OLCtfNcpdtEwEHwn2QgjAd+mBtLQ0nz394uJiop97iIgSh/MFr6JlIjhJsBdCAFVLD5hMpgo9/flz55GTk8PZ+b/R6Iv3ANh5vIQ298wJ+5mrDYEEeyEEULX+TFZWFnn5+djtdnLz8pg+dTJL2yZ7jh/2jRlHZDSzKy06IoKTBHshhId36QGj0YjD4UzTzMhMoWdKHACL9mTz8WErCmiWnCDFxxoICfZCiCosVivjJ04gM9bA011aeF4ftG6P52cNTJ44SVI4DYQEeyHCQOUhlb62zWYzABkZGWzduoX3e5WnZiZsPcD+4/YK11RKYTBI6YOGQoK9ECGu8pDK+XPncef0aRW2p067kyPZ2SiluOncVK43xQDw6RErC37JrnLNqKgoUpKTqyz4LYKXrFQlRIirPKRy63dbq2zn5eeTGB3JB73aeAJ9zo3Tib7qRp5fvIT4Jk0qXDM2Npan582XFE4DIj17IUJc5SGVXS/oWmX7mc5ptIpxToZ6YvdhthQ6SPrlIc/onGKbrcI1i4uLycnJISE+PhC/kjgNEuyFCHG+lvRbvHARZrOZ2OyDxL/wMPExkdgbxfFl275s2fRClYlVyUlJ5OblUVpaSnR0tCwB2ABJsBciBFV+AFt5NSfb8WO0W/1i+fatdxPTtDl9bTbeevutCmu6en9ZmEwmcnJyZAnABkiCvRAhxD2qZu78eRRYLD5r3Dg+fZf479cDsPJAHu8cLmLONUVkNm1e7cLebkZZArDBkmAvRIhwj7o5mptLSUkJALl5eZjNZs5v185TtMz9P/3gdXsoA1KSkyukZCr/K+B0CqSJ4COjcYQIEe7yBu5AD+BwOJg7fx5lC+71VKe0XzuGUb8UEm00kpKcwsIFz9YYvH0VSBMNj/TshWhAfNWbd79mMploEhdHbl6e5/j+pjimnxsPdhu0PAd1w+0YocZUTWWVR/PIg9mGSWmtA92GKrp166Y3b94c6GYIEXDewR2okk6x2WxMmjKZwqIikpOSmPX4E0yfMYPSE8d4/cLyoGwb/QAxicnV3eaU2iEpnOCllNqite7ma59fe/ZKqfnAWuA/wH5gt2vXNK31Fn/eW4iGrnKufNrUOyukU8xmM0/Onu3pyefl52O1Wnnpqt5E7v0RgJwu/Yjve3mVfwWcatCunMcXDY9fgr1SKhp4FbgYZ7BvD7yjtZ7kj/sJEYoq58qBCukUgKJjRZ7jOzZNoM2qxZ7tvUPHk9bCWcRsz969mEwmpk67k7z8fJKTkliyaLH00sOIv3r2BmA58JNruxPQXSm1FtgMTNdal/np3kKEhMq58oyMjAq5dpvNRlxsHGjNu91bes67Y8fv/Fp4gqhN95KYkABAgcVCbGwsea5/BRzJzmb37t3ExcVJaiZM+DVnr5R6GPgesABRWutPlVILga+11isqHTsGGAPQsmXLC/fv3++3dgnRUFSXdnGneHobSrilVRIAa/NtPPPLEez28uqUBoMBrTUOhwNDtAG7w7lPAUlJSRw7flyGU4aQM87ZK6XSgHTgZ6111RJ4J/ct4P4EfgT0qXyA1nopsBScD2hP4x5ChBxfufJim40ta79g2Tnlxcmu3bAXog3ExcaSZy8P6IkJCSilKLBYSExIQGtNgcVCXFwcRUVF2O12z3BKycmHtpMGe6XUHcBAIBVYppRqp7WeeIr3mQlsAlYCfYFtp3i+EGGlph794dkz+KOraNlTv+SwIaeQqGgDSYmJTJowkUdmPobdbicqOpq7pk0nNTWVrd9tpesFXTEajZ5hmt5ljmU4ZeirTc/+Wq11H6XUF1rrxUqpb07jPnOA15VSY3Hm8d85jWsIEXKqW0Rkzry55BcUVHiQqn/9CeM/X6BVTCRHih3cvv13Jk+cyO0XdPXUqwFITkryBPHU1NQKQX3xwkWeHvypjLUXDV9tgr1WSjV1/R0H2E52gudErR/22rz0FNsmREirblGRvLx8T279SHY27737DsMObfWcd5e5EHOu84ug58U9iTEaK5QarrxoeOXZr+5gL8Mpw0ttgv00YBXQDlgN3O/XFgkRJrwDcV5+Pv/5+D/k5ZcHeoBRrZsyxBXo3UXLkhITmfnIo2RkZFRJ8biDvDuIy+xX4XbSYK+13qSU6ofzec/5wI9+b5UQIco7IKelpZGYkOApXPbm22/jcDgA+ENMNC92a+U5z120DJzDKA0Gg8/ROZWLlZ2siqUIH7V5QDsbZ4BvB5wDHANu9nO7hAg5FquVSVMmY7FaiW3cmMceeRSb3U5paSkAZWXOcP7mxa2Ji3I+gL17exY/WosrXCchPh673U6xzeYJ3pKuESdTm6qXF2ut/wF011pfC7Twc5uECDnFNhuTpkwhNy+PkpISLFYrk6feQYFrZiw4i5at7p1JXFQk2wuOM2jdniqBPioqipKSEh546EEmTJroWS7Qna4xGo2SrhE+1SZnH6mUmg58q5TqCcT6uU1ChATvlI3ZbMZaaPV5XKNIxTs9y3vew78xU1ji7OVHRETQqFEjjh07Bjh7/4VFRTgcjgo9eEnXiJOpTbAfBVwCPAJcBdzk1xYJ0QCcrKCYdw49IT4eu8Phycd7u6ftWfRuGgfA4j3Z/Odw1S8Eo8GI3W7H4XAQFRVFk7g4io4dq9KDl3SNqEltgn0ucC7OETlm4Cu/tkiIIFeblZu8c+jZOTlVrtEm1siCC8ozooPW7fF5L2dPvpDGjRpxQimSk5KYP3eerAMrTlltcvavAJ8Bt7r+fs2fDRIi2Pl6GFpss7Fn794KOfTEhASioir2pxSwunemJ9BP2HqgSqAfeMklREZGerZLS0oottloEteE+XPnkRAf70ndCFFbtenZN9Zaf+D6+V9Kqan+bJAQwa7y2HWTyVSlpw+gta6wRODQ1ERua90UgM+OWHnmF99lptauW4fWGoPBQKNGjThx4gQ215dITk5OhQlUQtRWbYJ9gVJqMvAN0ANnWkeIsDZt6p0AZGRkVJkctXv3bg79/ptnUZHE6Ehe79Hac+61G/ZiK6u+1p+7amWjmBiemTefe++/TyZFiTNWm2A/DBgHjAT2ADf6tUVCBDFf+Xp3yiY7Oxu73c4DDz2Iu3T4/M5pnNskBoDHd/3O17nHary+Uspz7oniYqxWq4yyEXWi2py9Umqyq0c/BigDfnb9Paqe2iZE0PGVrwcYfNVVuPvqWmsuSGzE6t6ZnNskhuxiB4PW7akx0CulSEpM5LlFi0lJTsZgMJCclOQJ8JKjF2eqpp69pd5aIUQQqM36rN75+sSEBPLy8njokYcpsDj/d4lS8K9emZ7jb920jxxbSYVrREdF4fDK5d939z00b97cc9+lz78gPXlR52pcqUopdRXwoda6TCl1AdBSa/1vfzeqW7duevPmzf6+jRAetRlOabFa2frdVtqf356jR48yZ97cCsMqb2udwtBU56pRbx7I4/UDeT7v9dADf2fh4kVYCwtJSU6WtWBFnTmtlaqUUn/HuVD458BxwArcrJQ6X2s9yy8tFSJAaqotA85Af9PImyktKyNCKW65eSRHc51jFWoqWuYtIiKCpikpdOrUiRdfWCq9d1GvakrjXKG17une0FrvVUpdD3wNSLAXIaW6UsDu1M7327ZR6ipUVqY1L/3jFaBi0bJ7tmfxQ6VaNt7chc5AZruK+ldTsLdXfkFrXaqUqv7TLEQD5au2jDu14y5B7K2/KY7p550FwPaC49z3w2+1uk+BxSLrvYqAqCnYf6eUGuNaCBwApdQo4Bf/N0uI+uXuwZtMJs/fW7/b6qlS6Va5aNmIb8xYS3wlbapyj7iRsfIiEGoK9jOAh5VSO4ESnMM03wfG10fDhKgv3g9nHQ4HERERlJWVERERUSHQ331ec/qYmgCwZE82H/koWladpMREpk+bRtvz2kqOXgREtcFea20H7nP9EaJB8jWcsvJr3g9noTy37v67tkXLwLmwSERkJMePHye2cSzWQislJSUcP3GCuNg4CfQiYGozg1aIBsnXcErA5wzY2NhYT7B3U8AHvcvHzE/ceoB9x6s8yqrg+IkTPPHYTAwGAyaTiTunT5NSByIoSLAXIau62a6+hljefOONPPPss55zh5ydyKgMZ9Gyz49YebqaomWVJSclVVgIXEodiGBR0zj7a7TWq5RSU4DKM6/swFdaa1l8XAStyrNd7XY7qampVSpWfr9tG8+98AJw6kXLwDkDNjYuFkO0oUKgBxliKYJHtTNolVKXaa0/UUqN9LE7Gpigtb7AH42SGbSirhTbbJjNZubOn0eBxUJiQgLjxozFvO9Xsg5msX3HDnLznJOjvIuWPbHrdzbUUMsmIT6eP//pz1zxl7/QzGSql99FiJM5rRm0gFEpNRjIr7xDa/2+Ump7XTVQCH+JMRoxGAwUWCzOVaOys3lk5mMVjumS2IiZHVIByLE5uHXT/hqvGRkZSUxMDMNuuEFSM6LBqCnYu3vtA4CjwEagM5ACvK+13ujntglxxoptNoqOFRHbOBZdprE7yh+wnqxoWZO4OAqLiqpcs7S0VCZHiQanpqGXjwAopXprrf/qfl0p9Xl9NEyIM2WxWpk4ZTL5eXloIDEhgRgdg9Vq5f/SU7gmzVm07K2Deby2v2rRsof+/iA2m415T8+nsKiIJnFxREVFYbFaZXSNaHBqMxqnkVJqILAN6IZzRJoQQc1itTJu/HisheUTnwosFs6KiWKF13DKq9fvobSa56+PzpzJy8uXVyhaBsjoGtEg1SbYjwDuAKbiTOkc8GeDhDhV3pOkAMxmM4/PeqJCoAd4o0drEqKdRcvu3XGIHZYTFfZHR0fjcDg828dPHPekarzTNZK6EQ1RjcFeKRWJM3efAVwMzARW1EO7hKgV74lTiQkJAOTl51cI2n2bxjGjrbNo2Q7LCe7dccjntZwLeSuO5h4FICU5WVI1ImTUNM5+PtATWAM8DMzSWj9RP80SonYqL/YNeAJ9bYqWRUZGUlpaCkBhUREzH3nUs6/ymHkhGrKaevatgd+AvThTNzXPLBEiANLS0kiIjyc7JweHw4FSzkdKM85rTl9X0bLn9ubw4e++V9m8ZshQ1n61lgKLhaTERAnwImTVNBpnqFKqKXA98B7QVil1C/AvrXVB/TRPiOoV22zs/mk3x48f97yW0dhQ66JlAF26dGbYDTfIQ1cR8mrM2WutjwJLgCVKqdY4H9auAbr4vWVCVFL5QeztE8Z71oCtbdGywVcOYsM3X3uGT7pLDstDVxHqal0ITWv9K/C4648Q9cpitTJpyhSKjhWRmJDAtdde6wn0V5+dwOgMZ8mC/2Vbmf+z76JlzUwmRo4cyciRI6vtyfsqiSxEKKi2Nk4gSW0c4a3YZmPMuLHk5pVPfIqIiKBJpOKNWhQtS0xI4K5p02nbtuaFQ3yVRJaALxqS062NUxc3ng+sBT4E3gD+AOwExulg/JYRQSkrKwuLteKY+Tkdz+Y8V9GyWbt+Z301RcsiIiK4a9p0unTuXKv7+Cp/LEQoiPDHRZVS0UqplcBQ10vXAj9qrfsAxcCl/rivCD3u2jbu5QE7JzRide9MzmsSw1FbCYPW7WG3NhIRUfGj7BwzD1prnl20kOJKC5P44i6JbDQapRyCCDn+6tkbgOXAT67tHjhH9AB8BvRx/S1EFe68eXx8PNNnzMBitRCp4N9eRcv+b9M+sl1Fyy4ZcAlnn/0HFixc6Nn/txF/Y9lLy7Hb7bUuWhZjNMpiIyJk+SXYa62PAZ8ppXq7XooHCl0/HwPiKp+jlBoDjAFo2bKlP5olgkh1D0LdefO8/HxKHA7KtObW9BSudRUte/tgHq9WKlp2zjmZJCUmoZRCa41SitTUs0lOSjrlJQFlZI4IVfW1LKGV8gAf59quQGu9FFgKzge09dQuEQA1PQh1583tdjvNjVEsvyjdc151RcuSEp1LATYzmTzXbHteW+mlC+GlvoL9JqA/8BXOfP1H9XRfEYRqehDqzpvPT29MfA1Fy9yamUyeWa9LFi2uEtylly6EU30F+3eAV5VSG4DdwH/r6b4iyBTbbNjtdhITEjwlCrxTLEbzjyw7x1nm4AfLCe6ppmhZUlIS06feWWE4paRghKieX4O91vphr83h/ryXCH6VK1TOfORRT69c24thwX2eY30VLXOLjo7mvrvv4fx27eqr6UI0ePXVsxeiQvqmwGLBYDA4A/0Hr8Hu75wHXToUa2Znjm242XOewWAgLi6OqMhIT5mDjIyMAP0WQjRMEuxFvXHn490PUVsYItBz7iw/YPo8lFIkAK/941W2freV9ue3x2q1yipRQpwhKZcg6k2xzYbZbKaoqIiL1qws3zFyGqpZauAaJkSICFi5BCHAWcTs240bWfnmSnrFlHJbq2QAvsgu5MK/z/PMdhVC+I8Ee+FXB7OyuH3iBOKjInwWLZuycSN/HjgwgC0UIjxIsBd+Y7FauX3iBOZ0TKVtvO+iZSvfXEnfPn0kBy+En/mlEJoIXcU2G3v27q22sJj3fvOaT/igVxvaxseQ6ypattFiZ/Rto4iKcvYzLFYrWVlZ9fkrCBGWpGcvau1k9d7d+62WAt7u1sKznNltm/ZxxFZCdHQ0yUlJpKe3IiU52eekKiGEf0iwF7V2snrvWVlZDIrTDDnHuQZs/rldiRwwmJu6O4dQHj16lLnz5/HozJlVJlUJIfxL0jii1mqq964LcmmzajFD/uAcWTP2l0IaX34dCfHxDOjXn2YmEwaDgQKLpcqkKiGE/0nPXtRadfXe9eIH4XgRAPahoziojDzrY+JT5UlVkr4Rov7IpCpx2vTu7+CD15wbqa1RIyad9BxZ0FsI/5FJVaJOabsNFtxb/sKER1GNq6xH45NUphQiMCTYC8B3j9v7NXA+gE3/YR2RP29znnTpUFTXPoFqshDiFEiwF1VKD0+/cxqpqancOX2a57WWxggealXee7dNeoKYmJgAtloIcSok2Icxd8/dbrd7hlRm5+Rw398fIL5JEwqLirDb7Sw/t7x2zaTvDvDrMTvNf57IkkWLJe8uRAMhwT5MVe7NJyYkkJ9fgN1hx+FwYLFauaJZLGMynIu/f5FdyLyfj3jOz8vPrzLOXggRvGScfZiqvJDIuDFjiYlx9tLjoyL418XpjMkwAfDXDXsrBHqA5KQkGTopRAMiPfsw5T3mPTEhgYVLFmMtLGROp1TaxTcC4Mndh1l3tKjCeUmJiUy/c1qFtV+FEMFPgn2Y8B5ZY7PZ+Hbjt4wdM5a42FgA3pz7OK/2zgQgz17CzRv3VThfKcWD9z9Ap06dJMgL0QBJsA8D3vn5uNhYcvPyPPuS4uN5rVMzHmnbDIBRm/dzuNhR4fyoqCgeeeghunTqXK/tFkLUHcnZhwHv/Lx3oB/ZKoXXOjmD/DsH89nQ+zpmLXqelOQUDAYDERERGAwGmqak0Pa8toFqvhCiDkjPPgScrARBWloaiQkJZOfkoLWmuTGK5Rele/ZfvX4PpRrUU0/yxquvsfT558nKysJkMpGTkyOlDYQIARLsG7jqasy7vwBMJhM//fQThUVFaK15rXs6SQbnf/b7dhxiu+WE51paa7Z+t5UB/fp7hlTK+rBChAYJ9g2crxrzaWlpTJg0kbz8fBwOB1pr+jSN4+6uzgewO60nmLH9UJVrRURE0PWCrvX9Kwgh6oEE+wbOV9lgs9lMXl4+doedmAjFP3tleo4f8Y0Za0lZleuMuW0U/fv3l568ECFKgn0DV7nGPMCceXOxO+xMP7c5/Zs1AeCFvTl88LulyvmxsbEsWvAszUymem23EKJ+SbAPAd5lg7/fto3Y4xZW9y7vzQ9at6fac0tKSrBarRLshQhxEuwbKF8jcCwWC53/+w8WXuCsZzPpuwMctJURFxdHUVH5TNjIyEji4uIoLi6WFaOECBMS7BsgXyWJ0/OziF//HwDWZBcy11XLZvy42+ndqxd33DmV7JwcAJqmpPD0vPkyrFKIMCLBvgHyHoFTnHeUdqtf9Oz764a9FJeVLzWZevbZJMTH89ziJZjNZgAyMjKIMRrlYawQYUSCfQNkMpkocTh4qmMq7ROcRcue2n2Y9XnHiVCRQInnWIPBADjz+ue3axeI5gohgoCUSwhSxTYbe/bupdhmq7KvcOd3/PuPGbRPaES+vYRB6/bw1dEioqKimDB+PM1MJqKjo2nerBkZGRkBaL0QIthIzz4IWaxWJk2ZQtGxogqzYi35+cQve4xU13G3b/sNW0wsycnJHDt2jKTERPr26UPfPn1qLJ8ghAg/EuyDTLHNxqQpkz0FyzyzYs3biP9+HQDvHiqg7/1PMd1qrbAYuHdwlxWkhBDeJNgHWOUhlFlZWRR6DZNslRBHm1WLPdvuomUpO39kQL/+ntcluAshalJvwV4pZQT2A7tdL03TWm+pr/sHI/cQyrz8fJrExTF39hyKiopo1KgRdrudf1yUTorR+Z9o1q8W1h9yDp2MUEpq2AghTkl99uzbA+9orSfV4z2DWlZWFnn5+djtdnLz8rh11G0A9G4axz2uGbC7rCe4y6tomXshERk2KYQ4FfUZ7DsB3ZVSa4HNwHStddWKXGEkLS2NJnFxnvy8MULx7h/L0zG+ipaVlZXROr11vbZTCNHw1efQy/3AA1rrvkA0MMx7p1JqjFJqs1Jqc45rpmeocg+rBJg7ew5KKaad29wT6Jeacxi0bo/P6pRRUVGE+vsjhKh79dmz/xawu37+COjjvVNrvRRYCtCtWzdNCCq22di9ezfznnmaY8eOERcbx3233cwHvcp781et24P3L5+YkMj428fx/AtLOXb8mNSyEUKclvoM9jOBTcBKoC+wrR7vHXDFNhu3TxjvqU8D8O5FLeDrDwCY/N0BzMfsREdHM37cOJqZmmEwGDylDS7seqGMnRdCnLb6DPZzgNeVUmOBn4B36vHeAVNss2E2m9m+Y4cn0A/6QwLj2jhLCruLliUlJWEsUa6JUX2rBHTvMsZCCHGq6i3Ya61/By6tr/sFg+ycHCbdMcVTXjg+KoIVF5eXL/AuWnbzjTeS0TpDeu5CCL+QSVV+YrFaPUMpgQpFy2bvPszao+UTp5RS9OjeQ4ZTCiH8RoJ9HbNYraxevZp3Vr0LQMeERszq6KxmU2Av4caN+yocHxcXx8JnFkigF0L4lQT7WvK1MlTl/bt37+aBhx5Ea02kosLSgLdt2scRW3np4c6dOjPk6sF06thJ0jZCCL+TYF8L3itDeVeh9N7vPdJmRMtkRrRMBuDdrHxe3pdb5Zp333WX9OaFEPVGgn0teK8M5a5CmdmmDRarlW83buSLNV+QnZNDQnQkb/Qon93qLlrmTdI2QohAkGBfC2lpaSQlJnp69mlpaRzMymLchPGeYya0MfGXPyQ4f956gP3H7RWuMeH220lvle4ZNy+EEPVJgn0txBiNLF64yJOzt1qtnkB/XhMj8zq3AOCtg3m8tj+vyvkvL1tOM5OpXtsshBDeJNjXkntS08GsLCZOmUyUgqUXtqJZTDSlWjP8m185Xlqxls0dkybTp08f6ckLIQJOgr0P1Y28caduvGfAPvzjb2zOP17lGtKbF0IEEwn2lfgaeWOz2Vi3fj3vv/EPz3DKjXnHeHTn7z6vYTQasVqtEuyFEEGjPkscNwiVR9689dZbjLjpRpK+fI/nO58NOMfMewf6hPh4Hvr7gzRv1gyj0SiVKYUQQUd69pWYTCZiGzfG4XBQVlrKns8/8vTml5pzeP83S4Xj77vnXi7s2pUYo5FOHRdLZUohRFCSYO9lr9nMlDunorWmUaRiRfdWREcocm0ljNq8H4d2Dpq/6spBtGjRgt69elUYLy+VKYUQwSrsg32xzcb2HTv45L+f8M233wIVZ8DetS2LXYXFnuMT4uO5ZeRI6bkLIRqUsA72FquVseNvp7CwEICWjQ0s6doSgE8OW1i4p+Lyf/Hx8Ty3eIkEeiFEgxNWwd49pDI+Pp4vvviC11a8gdaaCGBO5zTOaxIDwI3f/kqBo9RzXkxMDHdPv4tOnaRomRCiYQqbYF9sszF+4gRyjh6lrKx88lPfpnHMaHsWAHN/OsyanKIK5yUmJLBk0WKpZSOEaNDCJtibzWaOZGd7tr1XjfqlsJhp27Ioq3TOhHG3c8kll0hvXgjR4IV8sHfXmf/gw9We105WtKxp06bcOeUOOnfqVK9tFUIIfwnZYF9ss7H7p908NXs2VtcDWO+iZW8fzOPVSkXL/nTppYwYPkJmvgohQk5IBvvKi4nUpmjZ3Kdm065t20A0Vwgh/C6kgn2xzYbZbObrb772BPqTFS2Ljo5m4TMLaCHlDYQQISxkgr17tI37IazJGMXLF6UDvouWjbhhGO3bt6dt27byAFYIEfJCJthnZWV5Av397c6iZ0ocUHWhb5CUjRAi/IRMsE9LS6OxIZq3u7cCfBcti4iI4Jl582mTkRGIJgohRMCETLCPMRoZM2Ycqz9ayUv7crGXla/03bFDR64ZMkRmwAohwlbIBHuAPn37MmbFG9jLNBEREbTJyGDs6DGSshFChL2QCvYxRiNLn39BasoLIUQlIRXsQWrKCyGEL7IsoRBChAEJ9kIIEQYk2AshRBiQYC+EEGFAgr0QQoQBCfZCCBEGlNb65EfVM6VUDrA/0O0IoKbA0UA3IkjJe1MzeX+qFw7vTSuttc8FOYIy2Ic7pdRmrXW3QLcjGMl7UzN5f6oX7u+NpHGEECIMSLAXQogwIME+OC0NdAOCmLw3NZP3p3ph/d5Izl4IIcKA9OyFECIMSLAPIkopo1LqsFJqjevPhYFuU7BQSs1XSg1RSkUrpd5WSn2llHpBKaUC3bZg4PX+yGcIUEo1Ukq953oPPlZKmcL9cyPBPri0B97RWvd3/dkS6AYFmiu4rwSGul66FvhRa90HKAYuDVjjgoCP90c+Q043Aeu11v2BfwK3EeafGwn2waUT0F0ptdbVU5P/PmAAlgP/cG33AL5w/fwZ0CcQjQoild8f+Qw5rQCWuH6OAmYR5p+bcP0gBKv9wANa675ANDAswO0JOK31Ma31Z14vxQOFrp+PAXH136rg4eP9kc8QoLUu0lofV0q1BW4HXiLMPzcS7IPLt5T3Pj4COgSwLcHKSvn/qHGubVFOPkMuSqkuwEqcX3hh/7mRYB9cZgLXuX7uC2wPYFuC1Sagv+vnS4FvAteUoCSfIUAp1RJ4Ffir1noX8rmRYB9k5gCjlFJrgGTgncA2Jyi9A5yvlNoANAH+G+D2BBv5DDndhfPzsdz1XpgI88+NTKoSQogwID17IYQIAxLshRAiDEiwF0KIMCDBXgghwoAEeyGECAMS7IVwUUr1U0p94Sqe9ZlSqmug2yREXZGhl0IASqkWOGdbDtZa5yml0oB/AwO11vmBbZ0QZy4q0A0QIkiMABZprfMAtNZZSqm3gC1Kqc1AM+A48FcgFngZ57T7A8D/ATcCVwAJQBIwRGv9W73/FkJUQ9I4QjilA/sqvbYfSAV2ukrlfo2zFMG9wPOu13YBN7iOt2qtLwPeAwb7vcVCnAIJ9kI4HQZaVHqtNXAI+Mq1vQlo6/pzr2sa/hCcXwgAP7r+/h2I8WNbhThlksYRwukN4DWl1OeunH1LYDjwAdAZ+BzoBvyMM33zttb6K6XU5UARkAnIAzARtCTYCwForfcopR4G3netWOcARuPMw1+hlBoMZAOzgU+AZUqpWThro4/AGeyFCFoyGkeIGri+AL7XWv8rwE0R4oxIzl4IIcKA9OyFECIMSM9eCCHCgAR7IYQIAxLshRAiDEiwF0KIMCDBXgghwoAEeyGECAP/D9e6ciX/slkWAAAAAElFTkSuQmCC\n"
          },
          "metadata": {
            "needs_background": "light"
          }
        }
      ],
      "execution_count": 15,
      "metadata": {
        "collapsed": true,
        "jupyter": {
          "source_hidden": false,
          "outputs_hidden": false
        },
        "nteract": {
          "transient": {
            "deleting": false
          }
        },
        "execution": {
          "iopub.status.busy": "2022-06-02T01:53:33.699Z",
          "iopub.execute_input": "2022-06-02T01:53:33.704Z",
          "iopub.status.idle": "2022-06-02T01:53:33.822Z",
          "shell.execute_reply": "2022-06-02T01:53:33.806Z"
        }
      }
    },
    {
      "cell_type": "code",
      "source": [
        "y_pred = model(torch.tensor([[22.290001]], dtype=torch.float32)).detach()\n",
        "y_pred.item()"
      ],
      "outputs": [
        {
          "output_type": "execute_result",
          "execution_count": 16,
          "data": {
            "text/plain": "22.314294815063477"
          },
          "metadata": {}
        }
      ],
      "execution_count": 16,
      "metadata": {
        "collapsed": true,
        "jupyter": {
          "source_hidden": false,
          "outputs_hidden": false
        },
        "nteract": {
          "transient": {
            "deleting": false
          }
        },
        "execution": {
          "iopub.status.busy": "2022-06-02T01:53:33.830Z",
          "iopub.execute_input": "2022-06-02T01:53:33.836Z",
          "iopub.status.idle": "2022-06-02T01:53:33.847Z",
          "shell.execute_reply": "2022-06-02T01:53:33.873Z"
        }
      }
    }
  ],
  "metadata": {
    "kernel_info": {
      "name": "python3"
    },
    "language_info": {
      "name": "python",
      "version": "3.6.13",
      "mimetype": "text/x-python",
      "codemirror_mode": {
        "name": "ipython",
        "version": 3
      },
      "pygments_lexer": "ipython3",
      "nbconvert_exporter": "python",
      "file_extension": ".py"
    },
    "kernelspec": {
      "argv": [
        "C:/Users/Tin Hang/Anaconda3\\python.exe",
        "-m",
        "ipykernel_launcher",
        "-f",
        "{connection_file}"
      ],
      "display_name": "Python 3",
      "language": "python",
      "name": "python3"
    },
    "nteract": {
      "version": "0.28.0"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}